Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
This PR implements the optimisation by yielding scheduler time to other goroutines if the current one is blocked. Previously goroutines take up the entire time quantum even if it was blocked, preventing other idle goroutines from executing.
Additionally, I have also added an naive deadlock detection mechanism, exiting from the program if all goroutines are blocked. However because of how syncing process of unbuffered channels work, we cannot simply exit the moment the scheduler sees that all goroutines are blocked. This is because during the syncing process of unbuffered channels, both the sender and receiver will be blocked, but progress is being made. Therefore, to detect deadlocks, we are checking for
N
consecutive cycles where allN
goroutines are blocked before exiting and erroring.I have also added a
@benchmark
decorator for testing our scheduler